// 高阶函数的概念：1.一个函数返回一个函数；2.一个函数的参数是函数

// 扩展方法  会用到高阶函数
function core(...args) {
  // 核心代码
  // ......
  console.log('core', ...args);
  // ......
}

// 给core函数增加一些额外的逻辑  但是不能更改核心代码

Function.prototype.before = function (cb) {
  // this = core
  // newCore 剩余运算符  可以把多个参数转化成数组
  return (...args) => {
    cb(); // 先执行传进来的
    this(...args); // 再执行core，这里this指的就是core，因为箭头函数没有this，往上找，谁调用的before，this就指向谁; ...args在这里叫扩展运算符
  };
};

let newCore = core.before(() => {
  console.log('before');
});
newCore('a', 'b');

// 1. 如果我们想给函数进行扩展  可以使用高阶函数
// 什么叫闭包？
// 函数的定义是哟作用域的概念，一个函数定义的作用域和执行的作用域不在同一个，这时候肯定就会出现闭包
